#include <bits/stdc++.h>
using namespace std;
#define DEBUG(x) cout << #x << " = " << x << endl
typedef long long ll;
const int MAXN = 5e3 + 10;
const int MOD = 1000007;
int N, M, K;

ll ways[MAXN][MAXN];
/// 前m个盒子放入n个球的放法
int main() {
  // freopen("in.txt","r",stdin);
  cin >> N >> M >> K;
  ways[0][0] = 1;
  for (int i = 1; i <= M; i++) {
    ways[i][0] = 1;
    ways[0][i] = 0;
  }
  for (int i = 1; i <= M; i++) {
    int sum = i;
    /*   ways[i-1][0]=1，ways[i-1][1]=i-1
    所以：ways[i][1]=ways[i-1][0]+ways[i-1][1]=i
     */
    for (int j = 1; j <= N; j++) {
      // int l = min(j, K);
      // int ans = 0;
      // for (int t = 0; t <= l; t++) {
      //   ans = (ans + ways[i - 1][j - t]) % MOD;

      //   对于第i个盒子装j个小球，可以从i - 1个盒子计算出来，
      //    即第i个盒子可以装0, 1, 2....k个球，对应i - 1个盒子，装j，j - 1，j
      //    - 2....j -
      //      k个小球的情况，求和即可， 时间复杂度O（mnk），超时。
      // }
      ways[i][j] = sum;
      sum = (sum + ways[i - 1][j + 1]) % MOD;
      if (j + 1 > K)
        sum = (sum - ways[i - 1][j - K] + MOD) % MOD;
    }
  }
  cout << ways[M][N];
  return 0;
}
